// Die Klasse Teilchen wird deklariert
class Teilchen 
{
  // INSTANZVARIABLEN
  PVector x, v, c; // Ortsvektor, Geschwindigkeitsvektor, Farbvektor
  float d; // Durchmesser der Teilchen

  // KONSTRUKTOR
  // Im Hauptsketch können für xTemp, vTemp, ... konkrete Werte eingegeben werden
  Teilchen(PVector xTemp, PVector vTemp, float dTemp, PVector cTemp)
  {
    /* Nun werden die Instanzvariablen der Klasse Teilchen den Variablen  
     der Funktionen zugeordnet, die im Konstruktor erstellt wurden */
    x = xTemp; 
    v = vTemp;
    c = cTemp;
    d = dTemp;
  }

  // METHODEN
  // Funktion für die Teilchenbewegung 
  // Die Größe von t wird im Hauptsketch festgelegt
  void move(float t)
  {
    // Zum aktuellen Wert des Vektors x wird  der Wert v*t hinzuaddiert
    x.add(PVector.mult(v, t)); // v = konstant --> a = 0
  }

  // Funktion zum Zeichnen der Teilchen
  void zeichnen()
  {
    noStroke();
    fill(c.x, c.y, c.z); // Die Farbe ist hier eine vektorielle Größe
    ellipse(x.x, x.y, d, d); /* Die x- und y-Komponete des Vektors x 
     geben den Ort eines Teilchens an */
  }

  // Die Funktion wand sorgt für die Reflexion der Teilchen
  void wand() 
  {
    if (x.x <= 0) 
      v.x = -v.x;
    if (x.y <= 0) 
      v.y = -v.y;
    if (x.x >= width) 
      v.x = -v.x;
    if (x.y >= height) 
      v.y = -v.y;
  }
}